package com.cy.pj.module.controller;

import com.cy.pj.module.pojo.RequestParameter;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;
import java.util.Map;

/*通过此处理请求中的参数
将请求参数直接复制给方法参数中的直接两遍量(8种封装类+Spring+Date)
将请求参数直接复制给pojo对象-pojo对象需要提供请求参数对应的set方法
将球球参数直接赋值给map对象-key、value

客户端常用传参方式？
1-url？paramName1=paramValue1&paramName2=paramValue2
2-rest方式;path/{paramNane}-------doMethod/{paramNane}
3-
 */
@RestController
public class ParamObjectController {//Handle
//    以直接量的方式接收请求中的参数（方法中的参数名需要与请求参数名相同）
//    http://localhost/doHandleRequestParam01?name=tony
//    @RequestParam此注解可以描述方法参数，用于对默认参数进行相关描述，
//    使用从注解描述参数时，默认客户端必须要传参数给服务端传一个值---不传默认400异常
//    @DateTimeFormat 描述日期参数，用于指定可接收的日期格式 默认格式为：“yyyy/mm/dd”
    @RequestMapping("/doHandleRequestParam01")
    public String doHandleRequestParam01(String name){
        return "request params is "+ name;
    }
    //    以直接量的方式接收请求中的参数（方法中的参数名需要与请求参数名相同）
//    http://localhost/doHandleRequestParam02?name=tony&startDate=2020/12/04
    @RequestMapping("/doHandleRequestParam02")
    public String doHandleRequestParam02(String name,
                                         @DateTimeFormat(pattern = "yyyy-mm-dd")
                                         @RequestParam(required = false) Date startDate
    ){
        return "request params name= "+ name+"/statDate="+startDate;
    }
    /*
    Rest风格的url定义
    一种软件架构编码风格，这种风格定义了url的一种格式其语法：a/b/{c}/b/{e}
    1/2/100/3/400
    其中{}内的内容为变量
    加入在方法参数中想获取rest url中变量值，使用@PathVariable注解方法对参数进行描述
    前提是方法参数名需要与url中的变量名相同
    @param id
    @return

     */


    @RequestMapping("/doHandleRequestParam03/{id}/{code}")
    public String doHandleRequestParam03(@PathVariable Integer id,
                                        @PathVariable Integer code
    ){
        return "request params name= "+id+"code="+code;
    }
    /*当请求参数比较多时，控制层方法
    通过方法中的pojo对象来接受请求中的参数数据，但这有一个条件
    pojo对象的set方法需要与请求参数的参数名匹配
    @param pojo
    @return

    http://localhost/doHandleRequestParam04?name=tom

     */
    @RequestMapping("/doHandleRequestParam04")
    public String doHandleRequestParam04(RequestParameter pojo){
        return "request params"+pojo.toString();

    }
    /*
    rest风格url传值
    @param pojo
    @return
    http://localhost//doHandleRequestParam05/tom/2020-12-12
    说明;当使用pojo对象节后rest风格中url中变量的值时，无需使用@PathVariable 对控制层pojo类型进行描述
     */
    @RequestMapping("/doHandleRequestParam05/{name}/{startDate}")
    public String doHandleRequestParam05(RequestParameter pojo){
        return "request params"+pojo.toString();

    }

    /*
    假如客户端请求参数比较多但又不想定义pojo接受请求数据,
    借助map，但不推荐，map一般无法对请求参数进行限制--
    @param map
    @return
    假如使用map接受请求参数，需要在方法参数前使用@RequestParam注解描述
    http://localhost/doHandleRequestParam06?name=aa&startDate=132
    失败
    */
    @RequestMapping("/doHandleRequestParam06")
    public String doHandleRequestParam06(@RequestParam Map<String,Object> map){
        return "request params"+map.toString();

    }

    /**
     * Rest风格
     * @param map
     * @return
     * http://localhost/doHandleRequestParam07/aaa/2020-12-45
     * 说明：当使用map接收rist风格中的数据时，需要使用@PathVariable注解对map参数进行描述
     * 不能使用@RequestParam注解，因为从注解描述的参数只能接收普通url中“？”后面定义的参数值
     */
    @RequestMapping("/doHandleRequestParam07/{name}/{startDate}")
    public String doHandleRequestParam07(@PathVariable Map<String,Object> map){
        return "request params"+map.toString();

    }

}
